#include <iostream>
#include <cstring>
using namespace std;

// 由于差分需要空出第一位，会导致所需要的空间增大，所以需要多开一点空间
const int N = 2000010;
typedef long long LL;
int A, B, C, m;
LL bk[N], a[N], s[N];
// 由于题目没有给出长宽高的具体范围，所以需要进行映射操作
int get(int x, int y, int z) { return (x * B + y) * C + z; }
// 差分所需要的修改方位
int d[8][4] = {
    { 0, 0, 0,  1 },
    { 0, 0, 1,  1 },
    { 0, 1, 0,  1 },
    { 0, 1, 1, -1 },
    { 1, 0, 0,  1 },
    { 1, 0, 1, -1 },
    { 1, 1, 0, -1 },
    { 1, 1, 1,  1 }
};
int op[N / 2][8];

void insert(int x1, int y1, int z1, int x2, int y2, int z2, int tmp)
{
    a[get(x1,     y1,     z1    )] += tmp;
    a[get(x1,     y1,     z2 + 1)] -= tmp;
    a[get(x1,     y2 + 1, z1    )] -= tmp;
    a[get(x1,     y2 + 1, z2 + 1)] += tmp;
    a[get(x2 + 1, y1,     z1    )] -= tmp;
    a[get(x2 + 1, y1,     z2 + 1)] += tmp;
    a[get(x2 + 1, y2 + 1, z1    )] += tmp;
    a[get(x2 + 1, y2 + 1, z2 + 1)] -= tmp;
}

bool check(int mid)
{
    memcpy(a, bk, sizeof a);
    for(int i = 1; i <= mid; ++i)
    {
        // 看题目啊，哥们
        int x1 = op[i][0], x2 = op[i][1], y1 = op[i][2], y2 = op[i][3], z1 = op[i][4], z2 = op[i][5], h = op[i][6];
        insert(x1, y1, z1, x2, y2, z2, -h);
    }
    // 求前缀和
    for(int i = 1; i <= A; ++i)
        for(int j = 1; j <= B; ++j)
            for(int k = 1; k <= C; ++k)
            {
                int idx = get(i, j, k);
                for(int u = 1; u < 8; ++u)
                {
                    // 奇数个1都是加，偶数个1都是减
                    int x = i - d[u][0], y = j - d[u][1], z = k - d[u][2], t = d[u][3];
                    // cout << d[u][0] << ' ' << d[u][1] << ' ' << d[u][2] << ' ' << t << endl;
                    a[idx] += a[get(x, y, z)] * t;
                }
                // cout << endl;
                if(a[idx] < 0) return true;
            }


    return false;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> A >> B >> C >> m;
    for(int i = 1; i <= A; ++i)
        for(int j = 1; j <= B; ++j)
            for(int k = 1; k <= C; ++k)
            {
                // 直接求出备份差分矩阵
                int tmp;
                cin >> tmp;
                insert(i, j, k, i, j, k, tmp);
            }
    memcpy(bk, a, sizeof a);
    // 输入攻击指令
    for(int i = 1; i <= m; ++i)
        for(int j = 0; j < 7; ++j)
            cin >> op[i][j];
    int l = 1, r = m;
    while(l < r)
    {
        int mid = (l + r) >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l << endl;
    return 0;
}

